home *** CD-ROM | disk | FTP | other *** search
/ Business & Presentations / Business and Presentations - Volume 1 (1995)(Sideface)(NL).iso / drivers / dvips54 / resident.c < prev    next >
C/C++ Source or Header  |  1990-11-25  |  20KB  |  736 lines

  1. /*
  2.  *   This code reads in and handles the defaults for the program from the
  3.  *   file config.sw.  This entire file is a bit kludgy, sorry.
  4.  */
  5. #include "structures.h" /* The copyright notice in that file is included too! */
  6. #include "paths.h"
  7. /*
  8.  *   This is the structure definition for resident fonts.  We use
  9.  *   a small and simple hash table to handle these.  We don't need
  10.  *   a big hash table.
  11.  */
  12. struct resfont *reshash[RESHASHPRIME] ;
  13. /*
  14.  *   These are the external routines we use.
  15.  */
  16. extern void error() ;
  17. extern integer scalewidth() ;
  18. extern void tfmload() ;
  19. extern FILE *search() ;
  20. extern shalfword pkbyte() ;
  21. extern integer pkquad() ;
  22. extern integer pktrio() ;
  23. extern Boolean pkopen() ;
  24. extern char *strcpy() ;
  25. extern char *getenv() ;
  26. extern char *newstring() ;
  27. extern int add_header() ;
  28. extern int add_name() ;
  29. extern char *get_name() ;
  30. extern int system() ;
  31. /*
  32.  *   These are the external variables we use.
  33.  */
  34. #ifdef DEBUG
  35. extern integer debug_flag;
  36. #endif  /* DEBUG */
  37. extern long bytesleft ;
  38. extern quarterword *raster ;
  39. extern FILE *pkfile ;
  40. extern char *oname ;
  41. extern integer swmem, fontmem ;
  42. extern char *tfmpath ;
  43. extern char *pkpath ;
  44. extern char *vfpath ;
  45. extern char *figpath ;
  46. extern char *configpath ;
  47. #ifdef SEARCH_SUBDIRECTORIES
  48. extern char *fontsubdirpath ;
  49. #endif
  50. #ifdef FONTLIB
  51. extern char *flipath, *fliname ;
  52. #endif
  53. extern char *headerpath ;
  54. extern char *paperfmt ; 
  55. extern char *nextstring ;
  56. extern char *maxstring ;
  57. extern char *warningmsg ;
  58. extern Boolean disablecomments ;
  59. extern Boolean compressed ;
  60. extern int quiet ;
  61. extern int filter ;
  62. extern Boolean reverse ;
  63. extern Boolean usesPSfonts ;
  64. extern Boolean nosmallchars ;
  65. extern Boolean removecomments ;
  66. extern Boolean safetyenclose ;
  67. extern int actualdpi ;
  68. extern int vactualdpi ;
  69. extern int maxdrift ;
  70. extern int vmaxdrift ;
  71. extern char *printer ;
  72. extern char *mfmode ;
  73. extern int lastresortsizes[] ;
  74. /*
  75.  *   To maintain a list of document fonts, we use the following
  76.  *   pointer.
  77.  */
  78. struct header_list *ps_fonts_used ;
  79. /*
  80.  *   We use malloc here.
  81.  */
  82. char *malloc() ;
  83. /*
  84.  *   Our hash routine.
  85.  */
  86. int
  87. hash(s)
  88.    char *s ;
  89. {
  90.    int h = 12 ;
  91.  
  92.    while (*s != 0)
  93.       h = (h + h + *s++) % RESHASHPRIME ;
  94.    return(h) ;
  95. }
  96. /*
  97.  *   cleanres() marks all resident fonts as not being yet sent.
  98.  */
  99. void
  100. cleanres() {
  101.    register int i ;
  102.    register struct resfont *p ;
  103.    for (i=0; i<RESHASHPRIME; i++)
  104.       for (p=reshash[i]; p; p=p->next)
  105.          p->sent = 0 ;
  106. }
  107. /*
  108.  *   The routine that looks up a font name.
  109.  */
  110. struct resfont *
  111. lookup(name)
  112.    char *name ;
  113. {
  114.    struct resfont *p ;
  115.  
  116.    for (p=reshash[hash(name)]; p!=NULL; p=p->next)
  117.       if (strcmp(p->Keyname, name)==0)
  118.          return(p) ;
  119.    return(NULL) ;
  120. }
  121. /*
  122.  *   This routine adds an entry.
  123.  */
  124. void
  125. add_entry(Keyname, TeXname, PSname, specinfo, downloadinfo)
  126.    char *Keyname, *TeXname, *PSname, *specinfo, *downloadinfo ;
  127. {
  128.    struct resfont *p ;
  129.    int h ;
  130.  
  131.    if (PSname == NULL)
  132.       PSname = TeXname ;
  133.    else if (strcmp(PSname, TeXname) && Keyname != PSname)
  134.       add_entry(PSname, TeXname, PSname, specinfo, downloadinfo) ;
  135.    p = (struct resfont *)malloc((unsigned int)sizeof(struct resfont)) ;
  136.    if (p==NULL)
  137.       error("! out of memory") ;
  138.    p->Keyname = Keyname ;
  139.    p->PSname = PSname ;
  140.    p->TeXname = TeXname ;
  141.    p->specialinstructions = specinfo ;
  142.    p->downloadheader = downloadinfo ;
  143.    h = hash(Keyname) ;
  144.    p->next = reshash[h] ;
  145.    p->sent = 0 ;
  146.    reshash[h] = p ;
  147. }
  148. /*
  149.  *   Now our residentfont routine.
  150.  */
  151. Boolean
  152. residentfont(curfnt)
  153.         register fontdesctype *curfnt ;
  154. {
  155.    register shalfword i ;
  156.    struct resfont *p ;
  157.  
  158. /*
  159.  *   First we determine if we can find this font in the resident list.
  160.  */
  161.    if (*curfnt->area)
  162.       return 0 ; /* resident fonts never have a nonstandard font area */
  163.    if ((p=lookup(curfnt->name))==NULL)
  164.       return 0 ;
  165. /*
  166.  *   We clear out some pointers:
  167.  */
  168. #ifdef DEBUG
  169.    if (dd(D_FONTS))
  170.         (void)fprintf(stderr,"Font %s <%s> is resident.\n",
  171.                                      curfnt->name, p->PSname) ;
  172. #endif  /* DEBUG */
  173.    curfnt->resfont = p ;
  174.    curfnt->name = p->TeXname ;
  175.    for (i=0; i<256; i++) {
  176.       curfnt->chardesc[i].TFMwidth = 0 ;
  177.       curfnt->chardesc[i].packptr = NULL ;
  178.       curfnt->chardesc[i].pixelwidth = 0 ;
  179.       curfnt->chardesc[i].flags = 0 ;
  180.    }
  181.    add_name(p->PSname, &ps_fonts_used) ;
  182. /*
  183.  *   We include the font here.  But we only should need to include the
  184.  *   font if we have a stupid spooler; smart spoolers should be able
  185.  *   to supply it automatically.
  186.  */
  187.    if (p->downloadheader)
  188.       if (add_header(p->downloadheader)) {
  189.          swmem -= DNFONTCOST ;
  190.          fontmem -= DNFONTCOST ;
  191.       }
  192.    tfmload(curfnt) ;
  193.    usesPSfonts = 1 ;
  194.    return(1) ;
  195. }
  196. #define INLINE_SIZE (500)
  197. static char was_inline[INLINE_SIZE] ;
  198. void
  199. bad_config() {
  200.    extern void exit() ;
  201.  
  202.    error("Error in config file:") ;
  203.    (void)fputs(was_inline, stderr) ;
  204.    exit(1) ;
  205. }
  206. /*
  207.  *   Now we have the getdefaults routine.
  208.  */
  209. void
  210. getdefaults(s)
  211. char *s ;
  212. {
  213.    FILE *deffile ;
  214.    char PSname[300] ;
  215.    register char *p ;
  216.    char *specinfo, *downloadinfo ;
  217.    int i, j ;
  218.    static int again = 0 ;
  219.    char *d = configpath ;
  220.  
  221.    if (printer == NULL) {
  222.       if (s) {
  223.          strcpy(PSname, s) ;
  224.       } else {
  225.          d = "~" ;
  226.          strcpy(PSname, DVIPSRC) ;
  227.       }
  228.    } else {
  229.       strcpy(PSname, "config.") ;
  230.       strcat(PSname, printer) ;
  231.    }
  232.    if ((deffile=search(d,PSname,READ))!=NULL) {
  233.       while (fgets(was_inline, INLINE_SIZE, deffile)!=NULL) {
  234. /*
  235.  *   We need to get rid of the newline.
  236.  */
  237.        for (p=was_inline; *p; p++) ;
  238.        if (p > was_inline) *(p-1) = 0 ;
  239.        switch (was_inline[0]) {
  240. case 'm' :
  241. #ifdef SHORTINT
  242.          if (sscanf(was_inline+1, "%ld", &swmem) != 1) bad_config() ;
  243. #else   /* ~SHORTINT */
  244.          if (sscanf(was_inline+1, "%d", &swmem) != 1) bad_config() ;
  245. #endif  /* ~SHORTINT */
  246.          break ;
  247. case 'M' :
  248.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  249.          mfmode = newstring(PSname) ;
  250.          break ;
  251. case 'o' : case 'O' :
  252.          p = was_inline + 1 ;
  253. #ifdef VMS
  254.      p[strlen(p) - 1] = '\0';
  255. #endif /* VMS */
  256.          while (*p && *p <= ' ')
  257.             p++ ;
  258.          oname = newstring(p) ;
  259.          break ;
  260. #ifdef FONTLIB
  261. case 'L' : 
  262.          {
  263.             char tempname[300] ;
  264.             extern char *fliparse() ;
  265.             if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  266.             else {
  267.                flipath = newstring(fliparse(PSname,tempname));
  268.                fliname = newstring(tempname) ;
  269.             }
  270.      }
  271.          break ;
  272. #endif
  273. case 'T' : 
  274.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  275.          else tfmpath = newstring(PSname) ;
  276.          break ;
  277. case 'P' : case 'p' :
  278.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  279.          else pkpath = newstring(PSname) ;
  280.          break ;
  281. case 'V' : case 'v' :
  282.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  283.          else vfpath = newstring(PSname) ;
  284.          break ;
  285. case 'S' :
  286.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  287.          else figpath = newstring(PSname) ;
  288.          break ;
  289. case 's':
  290.          safetyenclose = 1 ;
  291.          break ;
  292. case 'H' : 
  293.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  294.          else headerpath = newstring(PSname) ;
  295.          break ;
  296. case 't' : 
  297.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  298.          else paperfmt = newstring(PSname) ;
  299.          break ;
  300. case ' ' : case '*' : case '#' : case ';' : case '=' : case 0 : case '\n' :
  301.          break ;
  302. case 'r' :
  303.          reverse = (was_inline[1] != '0') ;
  304.          break ;
  305. /*
  306.  *   This case is for last resort font scaling; I hate this, but enough
  307.  *   people have in no uncertain terms demanded it that I'll go ahead and
  308.  *   add it.
  309.  *
  310.  *   This line must ha